/*
 * @Author: qiulin_JXGM ql1746365080@gmail.com
 * @Date: 2024-09-02 11:06:27
 * @LastEditors: Wang Shuo wangshuo@sgsimulation.com
 * @LastEditTime: 2024-09-06 15:11:23
 * @FilePath: \SGFEM\DataStructure\FEM\Element\include\CBEAMData.h
 */

#pragma once
#include "Utility/Algebra/Vector3D.h"

#include "DataStructure/Common/Constant.h"
#include "DataStructure/Input/Element/BeamCoordOptions.h"
#include "DataStructure/Input/Element/ElementBase.h"
#include "DataStructure/Input/Solver/DOFDirections.h"

SG_DATASTRUCTURE_FEM_NAMESPACE_OPEN
/** @brief 梁单元数据
 *
 * 梁单元的属性是用PBEAM、PBCOMP或PBEAML条目定义的。梁单元包括拉伸、扭转、在两个垂直平面上的弯曲、相关的剪切和下面列出的特征</p>
 *   +分布质量的极惯性矩。 </p>
 *   +分离剪切中心、中性轴和非结构质心。</p>
 *   +截面特性(A, I1, 12, I12, J)和非结构质量(NSM)沿梁的任意变化（(PBEAM only）。 </p>
 *   + 由于变截面引起的剪切释放(仅限PBEAM)</p>
 *   + 使用PLOAD1条目时，可以在梁的任意位置施加集中载荷（如单一力作用点）或分布载荷 </p>
 *   + 截面翘曲对扭转刚度的影响（仅限PBEAM单元） </p>
 *   + 使用PBCOMP条目时，可以模拟由偏置杆（即轴心不一致或不共线的多个杆件组成的结构件）构成的梁。 </p>
 *   + 非线性材料特性：仅限弹性-完全塑性（在MATS1条目中设置TYPE = PLASTIC）。 </p>
 *
 * @author qiulin            2024.09.02
 */

struct DECLSPEC CBEAMData : public ElementBase
{
    CBEAMData () : m_go (0)
    {}

    SG::DataStructure::Common::Id m_pId  = 0;          ///< 属性id
    SG::DataStructure::Common::Id m_g[2] = { 0 };      ///< nodes' id
    SG::DataStructure::Common::Id m_sa   = 0;          ///< A端对应的标量（scale）点或者网格（grid)点的ID,这些点上的自由度是翘曲变量dθ/dx
    SG::DataStructure::Common::Id m_sb   = 0;          ///< B端对应的标量（scale）点或者网格（grid)点的ID,这些点上的自由度是翘曲变量dθ/dx

    SG::DataStructure::Common::Real m_x1       = 0.0;  ///< 朝向矢量分量
    SG::DataStructure::Common::Real m_x2       = 0.0;  ///< 朝向矢量分量
    SG::DataStructure::Common::Real m_x3       = 0.0;  ///< 朝向矢量分量
    SG::DataStructure::Common::Id   m_go       = 0;    ///< 定向节点, 取值为 `DEFAULT_ID` 表示不使用定向节点，使用朝向向量
    SG::DataStructure::Common::I64  m_flag     = 1;    ///< GGG:1,BGG:65,GGO:17,BGO:81,GOG:5,BOG:69,GOO:21,BOO:85
    SG::DataStructure::Common::I64  m_pa       = 0;    ///< 节点1的自由度释放
    SG::DataStructure::Common::I64  m_pb       = 0;    ///< 节点2的自由度释放
    SG::DataStructure::Common::Real m_w1a      = 0.0;  ///< 节点1偏移量
    SG::DataStructure::Common::Real m_w2a      = 0.0;  ///< 节点1偏移量
    SG::DataStructure::Common::Real m_w3a      = 0.0;  ///< 节点1偏移量
    SG::DataStructure::Common::Real m_w1b      = 0.0;  ///< 节点2偏移量
    SG::DataStructure::Common::Real m_w2b      = 0.0;  ///< 节点2偏移量
    SG::DataStructure::Common::Real m_w3b      = 0.0;  ///< 节点2偏移量
    SG::DataStructure::Common::Id   m_domainId = 0;

    /**  @brief 朝向矢量，节点1和节点2 偏置矢量所在坐标系
     */
    std::vector<BeamCoordOptions> GetCoordOptions () const;

    /**  @brief 获取节点1的释放自由度
     *
     */
    DofSet GetDofSetOfPaRelease () const;

    /**  @brief 获取节点2的释放自由度
     *
     */
    DofSet GetDofSetOfPbRelease () const;

    /** @brief 获取节点1的偏移量
     */
    SG::Algebra::Vector3D GetWa () const;

    /** @brief 获取节点2的偏移量
     */
    SG::Algebra::Vector3D GetWb () const;
};

/// @brief 判断单元数据是否相等
DECLSPEC bool operator== (const CBEAMData &a, const CBEAMData &b);

SG_DATASTRUCTURE_FEM_NAMESPACE_CLOSE
